//构造函数和new的过程中发生了什么，手动实现一个new功能，详解https://juejin.cn/post/6933459367756824589
//手动实现构造函数new功能

function Person(name, age) {
    this.name = name
    this.age = age
    // return {    //带有返回值的构造函数在进行实例化的时候，如果返回值是一个对象，则作为实例化对象，如果不是对象则忽略
    //     name
    // }
}
Person.prototype.sayHi = function() {
    console.log('帅哥你好！')
}

// //原生食用方式
// let dajiao = new Person('谢大脚', 40)
// console.log(dajiao)

//模拟new
const objFactory = function() {
    let obj = new Object()                      //需要返回的对象
    let Constructor = [].shift.call(arguments)  //arguments第一项为传入的构造函数，shift删除并返回被删除的构造函数
    obj.__proto__ = Constructor.prototype       //改变obj的__proto__指向为构造函数的prototype
    let res = Constructor.apply(obj, arguments)           //执行构造函数，改变this指向，并传入其他参数, 获取返回值
    return (res && (typeof res === 'object' || typeof res === 'function')) ? res : obj
}
const dajiao = objFactory(Person, '谢大脚', 40)
console.log(dajiao)
dajiao.sayHi()